
package br.com.easyrhour3x.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import br.com.easyrhour3x.cq.QueryRamo;
import br.com.easyrhour3x.hDAO.GenericDAO;
import br.com.easyrhour3x.hDAO.SessaoFactory;
import br.com.easyrhour3x.model.Solicitacao;
import br.com.easyrhour3x.model.Usuario;
import br.com.easyrhour3x.model.UsuarioHasSolicitacao;

public class SolicitacaoController
{

   private List<UsuarioHasSolicitacao> lista;
   private GenericDAO<Solicitacao, String> dao;
   private GenericDAO<UsuarioHasSolicitacao, Integer> daoUsuarioSolicitacao;

   public List<UsuarioHasSolicitacao> aguardadoAtendimento(List<UsuarioHasSolicitacao> listaEmAtendimento)
   {
      // lista = new ArrayList<>();
      // Solicitacao solicitacao = new Solicitacao();
      // solicitacao.setIdsolicitacao("BSA000000");
      // solicitacao.setProjeto("NetBanking");
      // solicitacao.setDisciplina("Projeto");
      // solicitacao.setState("Solicitado");
      // UsuarioHasSolicitacao has = new UsuarioHasSolicitacao();
      // has.setSolicitacao(solicitacao);
      // lista.add(has);

      QueryRamo query = new QueryRamo();
      lista = new ArrayList<>(query.qryRamoPendente());
      for (int i = 0; i < listaEmAtendimento.size(); i++)
      {
         if (lista.contains(listaEmAtendimento.get(i)))
         {
            lista.remove(listaEmAtendimento.get(i));
         }
      }
      return lista;
   }

   public List<UsuarioHasSolicitacao> solicitacaoEmAtendimento()
   {
      Criterion criterion[] = new Criterion[1];
      criterion[0] = Restrictions.isNull("dataFim");
      daoUsuarioSolicitacao = new GenericDAO<UsuarioHasSolicitacao, Integer>(
         UsuarioHasSolicitacao.class);
      return daoUsuarioSolicitacao.listar(criterion);
   }

   public void iniciarAtendimento(String idRamo, String projeto, String disciplina,
      String state)
   {
      Solicitacao solicitacao = new Solicitacao();
      solicitacao.setIdsolicitacao(idRamo);
      solicitacao.setProjeto(projeto);
      solicitacao.setDisciplina(disciplina);
      solicitacao.setState(state);
      dao = new GenericDAO<Solicitacao, String>(Solicitacao.class);
      dao.inclui(solicitacao);

      Usuario usuario = new Usuario();
      usuario.setIdusuario(1);

      UsuarioHasSolicitacao usuarioHasSolicitacao = new UsuarioHasSolicitacao();
      usuarioHasSolicitacao.setSolicitacao(solicitacao);
      usuarioHasSolicitacao.setUsuario(usuario);
      usuarioHasSolicitacao.setDataInicio(new Date(System.currentTimeMillis()));

      daoUsuarioSolicitacao = new GenericDAO<UsuarioHasSolicitacao, Integer>(
         UsuarioHasSolicitacao.class);
      daoUsuarioSolicitacao.inclui(usuarioHasSolicitacao);
   }

   public void finalizarAtendimento(String idSolicitacao)
   {
      Session session = SessaoFactory.getSessionFactory().openSession();
      Transaction tx = session.beginTransaction();
      Query query = session.getNamedQuery("UsuarioHasSolicitacao.finalizarAtendimento");
      query.setTimestamp("dataFimParam", new Date(System.currentTimeMillis()));
      query.setString("idSolicitacaoParam", idSolicitacao);
      query.setInteger("idUsuarioParam", 1);
      query.executeUpdate();
      tx.commit();
      session.close();
   }

   public void cancelarAtendimento(String idSolicitacao)
   {
      Solicitacao solicitacao = new Solicitacao();
      solicitacao.setIdsolicitacao(idSolicitacao);
      dao = new GenericDAO<Solicitacao, String>(Solicitacao.class);
      
      Usuario usuario = new Usuario();
      usuario.setIdusuario(1);

      UsuarioHasSolicitacao usuarioHasSolicitacao = new UsuarioHasSolicitacao();
      usuarioHasSolicitacao.setSolicitacao(solicitacao);
      usuarioHasSolicitacao.setUsuario(usuario);
      
      daoUsuarioSolicitacao = new GenericDAO<UsuarioHasSolicitacao, Integer>(
               UsuarioHasSolicitacao.class);
      daoUsuarioSolicitacao.exclui(usuarioHasSolicitacao);
      
      dao.exclui(solicitacao);
   }

   public List<UsuarioHasSolicitacao> procurarAtendimento()
   {
      lista = new ArrayList<>();
      daoUsuarioSolicitacao = new GenericDAO<UsuarioHasSolicitacao, Integer>(UsuarioHasSolicitacao.class);
      Criterion in[] = new Criterion[]{};
      lista = (ArrayList<UsuarioHasSolicitacao>) daoUsuarioSolicitacao.listar(in);
      return lista;
   }

}
